/*************
author:: libo
license:: MIT
*****************/

//一些小算法
#ifndef LIBCELL_TOOLS_ALGORITHM_H_
#define LIBCELL_TOOLS_ALGORITHM_H_

#include<Mesh/_Func_.h>
#include<math.h>
#define quote lib_cell_quote

#ifdef __cplusplus
extern "C" {

#endif

//face要保证是单形

//把mesh或者点云调整到[-1,1]的立方体里
void Mesh_adjust_mesh_to_unit_hexahedron(Mesh* mesh);
//调整c的halffaces顺序，
//非单形也有效
//因为c的halffacess的顺序默认并不规则
//
Node* Mesh_adjust_halffaces(Mesh* m,template_c* c);
//二维流形沿曲线切割
//非单形也有效
//the face doesn't need to be arranged in order 
Mesh* Mesh_cut_along_the_curvef(Mesh* m,Node* faces);
//the vertices need arranged in order
Mesh* Mesh_cut_along_the_curvev(Mesh* m,Node* vertices);
// {

//     return  m;
// }
// template_v* Mesh_division_face(template_m*m,template_f*f,double *p)
// {
//     if(f==NULL)
//     {
    
//         return NULL;
//     }
//     int p_size,fv_size;
//     fv_size=f->vertices_size;
//     p_size=((template_v*)(f->vertices[0]))->point_size;

//     template_v* v1=m->create_vertexv(m,p,p_size),*temp_v[2][fv_size];
//     temp_v[0][0]=NULL;
//     temp_v[1][0]=NULL;
//     Node* node1[2];
//     node1[0]=NULL;
//     node1[1]=NULL;

//     for(int l=0;l<2;l++)
//     {
//         if(f->halffaces[l]->cell==NULL)
//         {
//             continue;
//         }
//         for(int i=0;i<fv_size;i++)
//         {
//             temp_v[l][i]=(template_v*)(f->halffaces[l]->vertices[i]);
//             printf("%d ",temp_v[l][i]->id);
    
//         }
//         node1[l]=node_copy(((template_c*)(f->halffaces[l]->cell))->halffaces);
//         node1[l]=node_delete_value(node1[l],(void*)(f->halffaces[l]));
        
//     }

//     m->delete_face(m,*f,true);
//     for(int l=0;l<2;l++)
//     {
//         if(temp_v[l][0]==NULL)
//         {
        
//             continue;
//         }
//         template_v* temp_v1[fv_size][fv_size];
//         for(int i=0;i<fv_size;i++)
//         {
//             temp_v1[i][0]=v1;
//             int k=1;
//             for(int j=0;j<fv_size;j++)
//             {
//                 if(j==i)
//                 {
//                     continue;
//                 }
//                 temp_v1[i][k]=temp_v[l][j];
//                 k++;
//             }
//             if(i%2==1&&fv_size>=2)
//             {
//                 template_v* temp_v3=temp_v1[i][0];
//                 temp_v1[i][0]=temp_v1[i][1];
//                 temp_v1[i][1]=temp_v3;
        
            
//             }
        
//         }
//         for(int i=0;i<fv_size;i++)
//         {
        
        
//             template_f*temp_f=m->create_facev(m,temp_v1[i],fv_size);
//             template_hf* temp_hf=m->create_halfface(m,temp_f,temp_v[i],fv_size);

//             node1[l]=node_overlying(node1[l],(void*)temp_hf); 
//         }
//         Node *m_node;
//          m_node=Mesh_adjust_nature_halffaces(node1[l]);
//         int n_size=node_size(m_node);
        
//         template_hf* temp_hf1[n_size];
//         int i=0;
//         for(Node n_it=*(m_node);*n_it!=NULL;n_it++)
//         {
//             temp_hf1[i]=(template_hf*)(n_it.value);
        
//         i++;
//         }
//         printf("n_szie:%d\n",n_size);
//         m->create_cellf(m,temp_hf1,n_size);
//         m->simplex=0;


//     }
//     return v1;
    
// }
//division_size是分割的几多变形(几多面体..)
//由于face是单形，又因为欧拉定理(亏格),所以由face组成的流形的边界的“边”数是face个数的函数
// template_v * Mesh_division_cell(template_c* c,template_hf* hf,double *p,int p_size,int division_size)
// {
//     template_v* v0=NULL;
//     if(c==NULL)
//     {
//         return v0;

//     }


//     return v0;

// }

// int Mesh_is_local_min_max(template_m*m,template_v* v)
// {
//     int min=1,max=1;
//     Node *vvit=m->vv_begin(m,*v);
//     for(Node vit=*vvit;*vit!=NULL;vit++)
//     {
//         if(*((double*)(v->prop))>*((double*)(((template_v*)(*vit))->prop)))
//         {
//             min=0;

//         }
//         else if(*((double*)(v->prop))<*((double*)(((template_v*)(*vit))->prop)))
//         {
//             max=0;
//         }
//     }
//     free_node(vvit);
//     if(min==1)
//     {

//         return 0;
//     }
//     else if(max==1)
//     {
//         return 1;
//     }
//     else
//     {
//         return 2;
//     }
//     return 2;

// }

#undef quote 
#ifdef __cplusplus
}
#endif

#endif